package fotoMultas.artifactFM;

import java.util.ArrayList;
import java.util.List;

public class FotoMultasSystem {

	private final List<Captura> capturasAIdentificar = new ArrayList<Captura>();

	private final Categorizador categorizador;

	private final IdentificadorDePatentes identificadorDePatentes;

	private RegistroDeVehiculos registroDeVehiculos;

	public FotoMultasSystem(IdentificadorDePatentes identificadorDePatentes, Categorizador categorizador,
			RegistroDeVehiculos registroDeVehiculos) {
		this.identificadorDePatentes = identificadorDePatentes;
		this.categorizador = categorizador;
	}

	public void ingresar(Captura unaCaptura) {
		try {
			RegistroDeVehiculo infoDeVehiculo = identificarPatenteDe(unaCaptura);
			penalizarVehiculo(unaCaptura, infoDeVehiculo);
			enviarNotificaciones(infoDeVehiculo);
			recategorizar(infoDeVehiculo);
		} catch (PatenteNoIdentificadaException e) {
			this.capturasAIdentificar.add(unaCaptura);
		}
	}

	public boolean isPendienteAIdentificar(Captura unaCaptura) {
		return this.capturasAIdentificar.contains(unaCaptura);
	}

	private void enviarNotificaciones(RegistroDeVehiculo infoDeVehiculo) {
		List<Notificador> notificadores = this.categorizador.getNotificadorPara(infoDeVehiculo.getPatente());
		for (Notificador notificador : notificadores) {
			notificador.notificar();
		}
	}

	private RegistroDeVehiculo identificarPatenteDe(Captura unaCaptura) {
		String patente = this.identificadorDePatentes.identificarPatente(unaCaptura.getFoto());
		RegistroDeVehiculo infoDeVehiculo = this.registroDeVehiculos.getVehiculoCon(patente);
		return infoDeVehiculo;
	}

	private void penalizarVehiculo(Captura unaCaptura, RegistroDeVehiculo infoDeVehiculo) {
		infoDeVehiculo.penalizarPor(unaCaptura.getInfraccion());
	}

	private void recategorizar(RegistroDeVehiculo infoDeVehiculo) {
		this.categorizador.categorizar(infoDeVehiculo);
	}

}
